/**
 * 基础配置
 */
const config = {
  // baseURL: 'http://j6982d86.natappfree.cc', // 建议通过环境变量配置
  baseURL: 'https://www.kbanloan.com/prod-api',
  timeout: 10000, // 请求超时时间
  header: {
    'Content-Type': 'application/json' // 默认请求内容类型
  }
}

// Loading 控制相关变量
let loadingCount = 0 // 请求计数器，用于处理多个并发请求
let loadingTimer = null // 延迟显示 Loading 的定时器
const LOADING_DELAY = 300 // 延迟时间，单位毫秒

/**
 * 显示 Loading
 */
const showLoading = () => {
  if (loadingCount === 0) {
    loadingTimer = setTimeout(() => {
      uni.showLoading({
        title: '로드 중...',
        mask: true // 防止触摸穿透
      })
    }, LOADING_DELAY)
  }
  loadingCount++
}

/**
 * 隐藏 Loading
 */
const hideLoading = () => {
  loadingCount--
  if (loadingCount === 0) {
    clearTimeout(loadingTimer)
    uni.hideLoading()
  }
}

/**
 * 请求拦截器
 * @param {*} options 请求参数
 * @returns
 */
const requestInterceptor = (options) => {
  // 添加token等全局header
  const token = uni.getStorageSync('token')
  if (token) {
    options.header = options.header || {}
    options.header['Authorization'] = `Bearer ${token}`
  }
  return options
}

/**
 * 响应拦截器 - 处理响应状态码和业务逻辑
 * @param {*} response 响应对象
 * @param {*} resolve 请求成功回调
 * @param {*} reject 请求失败回调
 */
const responseInterceptor = (response, resolve, reject) => {
  const { statusCode, data } = response
  if (statusCode === 200) {
    // 根据后端接口规范调整判断逻辑
    if (data.code === 200) {
      // 假设业务成功码为0或success字段为true
      resolve(data.data || data) // 返回核心数据
    } else {
      if (data.code === 401) {
        uni.removeStorage({
          key: 'token'
        })
        // 验证失效去登录页
        uni.reLaunch({
          url: '/pages/login/login'
        })
        return
      }
      // 业务逻辑错误
      uni.showToast({
        title: data.msg || '请求失败',
        icon: 'none'
      })
      reject(data)
    }
  } else {
    // HTTP错误
    handleHttpError(statusCode, reject)
  }
}

/**
 * 处理HTTP错误
 * @param {*} statusCode 状态码
 * @param {*} reject 拒绝函数
 */
const handleHttpError = (statusCode, reject) => {
  let errMessage = '请求失败'
  switch (statusCode) {
    case 401:
      errMessage = '验证失败'
      break
    case 403:
      errMessage = '拒绝访问'
      break
    case 404:
      errMessage = '请求地址错误'
      break
    case 500:
      errMessage = '服务器内部错误'
      break
    default:
      errMessage = `网络错误 (${statusCode})`
  }
  uni.showToast({
    title: errMessage,
    icon: 'none'
  })
  reject({ statusCode, message: errMessage })
}

/**
 * 核心请求方法
 * @param {*} options 请求参数
 * @returns
 */
const request = (options, retryCount = 0) => {
  return new Promise((resolve, reject) => {
    // 合并配置
    options = {
      ...config,
      ...options,
      url: config.baseURL + options.url, // 拼接基础URL
      header: {
        ...config.header,
        ...(options.header || {})
      }
    }

    // 默认开启 Loading
    const stateLoading = options.showLoading !== false

    // 请求拦截
    options = requestInterceptor(options) || options

    if (stateLoading) {
      showLoading()
    }

    // 发起请求
    uni.request({
      ...options,
      success: (res) => {
        responseInterceptor(res, resolve, reject)
      },
      fail: (err) => {
        // 不稳定的网络
        if (retryCount < (options.retry || 3)) {
          // 默认重试3次
          setTimeout(() => {
            request(options, retryCount + 1)
              .then(resolve)
              .catch(reject)
          }, 1000 * (retryCount + 1)) // 延迟重试
        } else {
          uni.showToast({
            title: '网络连接失败',
            icon: 'none'
          })
          reject(err)
        }
      },
      complete: () => {
        // 隐藏 Loading
        if (showLoading) {
          hideLoading()
        }
      }
    })
  })
}

// 导出常用方法
export default {
  get(url, data = {}, options = {}) {
    return request({ url, data, method: 'GET', ...options })
  },
  post(url, data = {}, options = {}) {
    return request({ url, data, method: 'POST', ...options })
  },
  put(url, data = {}, options = {}) {
    return request({ url, data, method: 'PUT', ...options })
  },
  delete(url, data = {}, options = {}) {
    return request({ url, data, method: 'DELETE', ...options })
  },
  // 原始request方法，用于特殊配置
  request
}
